/*
 * @Author: your name
 * @Date: 2021-04-09 17:35:10
 * @LastEditTime: 2021-04-09 17:43:37
 * @LastEditors: Please set LastEditors
 * @Description: In User Settings Edit
 * @FilePath: \TypeScript\16交叉类型.ts
 */
// TypeScript的高级类型

// 交叉类型 Intersection Types

// 交叉类型是将多个类型合并为一个类型
// 这让我们可以把现有的多种类型叠加到一起成为一种类型，
// 它包含了所需要的所有类型的特性

// 例如，Person & Serializable & Loggable 同时是 Person 和 Serizlizable 和 Loggable
// 就是说这个类型的对象同时拥有了这三种类型的成员

function extend<T, U>(first: Text, second: U): T & U {
    let result = <T & U>{};
    for (let id in first) {
        (<any>result)[id] = (<any>first)[id];
    }
    for (let id in second) {
        if (!result.hasOwnProperty(id)) {
            (<any>result)[id] = (<any>second)[id];
        }
    }
    return result;
}
class Person {
    constructor(public name: string) { }
}
interface Loggable {
    log(): void;
}
class ConsoleLogger implements Loggable {
    log() { }
}
var jim = extend(new Person("jim"), new ConsoleLogger());
var n = jim.name;
jim.log();